
#include <view/Texto.h>
#include <view/Fonte.h>

int LarguraDoTexto(::Fonte& f, std::string& str)
{
    int max_largura = 0;
    int largura     = 0;
    
    for(unsigned i=0; i<str.size(); i++)
    {
        largura += f.LarguraDoChar(str[i]);
        if(str[i] == '\n' || str[i] == '\r' || i == str.size()-1)
        {
            if(largura > max_largura)
                max_largura = largura;
            largura = 0;
        }
    }
    
    return max_largura;
}

int AlturaDoTexto(::Fonte& f, std::string& str)
{
    int num_linhas = 1;
    
    for(unsigned i=0; i<str.size(); i++)
    {
        if(str[i] == '\n')
            num_linhas++;
    }
    
    return f.Tamanho() * num_linhas;
}

Texto::Texto(std::string strTexto, int x, int y)
    : Controle(0,0,x,y)
{
    m_strTexto = strTexto;

    this->Fonte("verdana", 16, RGBA(0,0,0,255));
}

Texto::~Texto()
{
    ;
}

void Texto::operator=(std::string strTexto)
{
    m_strTexto = strTexto;
    
    this->Fonte(m_strFonte, m_nTamanho, RGBA(0,0,0,255));
}


void Texto::Fonte(std::string strFonte, int tamanho, int cor)
{
    m_strFonte = strFonte;
    m_nTamanho = tamanho;
    m_cor      = cor;
    
    ::Fonte f(strFonte.c_str(), tamanho, cor);
    ::MatrizRGBA& matriz = Matriz();

    Altura(AlturaDoTexto(f, m_strTexto));
    Largura(LarguraDoTexto(f, m_strTexto));

    for(int i=0; i<this->Largura(); i++)
        for(int j=0; j<this->Altura(); j++)
            matriz[i][j] = RGBA(0,0,0,0);

    int offset_x = 0;
    int offset_y = 0;
    for(unsigned i=0; i<m_strTexto.size(); i++)
    {
        if(m_strTexto[i] == '\n')
        {
            offset_x = 0;
            offset_y += f.Tamanho();
            continue;
        }
        MatrizRGBA& matrizChar = f[m_strTexto[i]]->Matriz();
        matriz.Mesclar(offset_x, offset_y, matrizChar, 0, 0,
                       matrizChar.Largura(), matrizChar.Altura());
        offset_x += f[m_strTexto[i]]->Largura();
    }
}


